package com.study.blob;

import com.study.preparedstatement.bean.Customer;
import com.study.preparedstatement.util.JDBCUtils;
import org.junit.Test;

import java.io.*;
import java.sql.*;

/**
 * @author shkstart  Email:shkstart@126.com
 * @Description 测试使用PreparedStatement操作Blob类型的数据
 * @date 下午4:08:58
 */
public class BlobTest {
    // 1）BLOB是一个二进制大型对象，是一个可以存储大量数据的容器，能够容纳不同大小的数据
    // 2) 插入BLOB类型的数据必须使用PreparedStatement，因为BLOB类型的数据无法使用字符串拼接
    // 3）MySQL的四种BLOB类型，除存储的最大信息量上不同外，其余无差别
    // BLOB类型 : TinyBlob(最大255字节) Blob(最大65K) MediuumBlob(最大16M)LongBlob(最大4G)

    //向数据表customers中插入Blob类型的字段
    @Test
    public void testInsert() throws Exception {
        Connection conn = JDBCUtils.getConnection();
        String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setObject(1, "袁浩");
        ps.setObject(2, "yuan@qq.com");
        ps.setObject(3, "1992-09-08");
        FileInputStream is = new FileInputStream(new File("girl.jpg"));
        // 文件以流的形式进行存储，将名称为girl的图片存储到数据库表customers中
        ps.setBlob(4, is);
        ps.execute();
        JDBCUtils.closeResource(conn, ps);
    }

    //查询数据表customers中Blob类型的字段
    @Test
    public void testQuery() {
        Connection conn = null;
        PreparedStatement ps = null;
        InputStream is = null;
        FileOutputStream fos = null;
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();
            String sql = "select id,name,email,birth,photo from customers where id = ?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, 4);
            rs = ps.executeQuery();
            if (rs.next()) {
                //			方式一：索引[角标]
                //			int id = rs.getInt(1);
                //			String name = rs.getString(2);
                //			String email = rs.getString(3);
                //			Date birth = rs.getDate(4);
                //方式二：别名[key值]
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                Date birth = rs.getDate("birth");

                Customer cust = new Customer(id, name, email, birth);
                System.out.println(cust);
                //将Blob类型的字段下载下来，以文件的方式保存在本地
                Blob photo = rs.getBlob("photo");
                // 获取二进制文件流
                is = photo.getBinaryStream();
                fos = new FileOutputStream("zhangyuhao.jpg");
                byte[] buffer = new byte[1024];
                int len;
                // 将数据表中查询到的二进制文件流，以文件名为zhangyuhao.jpg存储到工程路径下
                while ((len = is.read(buffer)) != -1) {
                    fos.write(buffer, 0, len);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null)
                    is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                if (fos != null)
                    fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            JDBCUtils.closeResource(conn, ps, rs);
        }
    }
}
